package frpc.manager.lock;


import frpc.manager.operation.*;

/**
 * 类描述:  Redis——锁处理接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/6/2 0002 下午 3:12
 */
public interface IRedisLockManager {

    /**
     * 功能描述：获取Redis操作处理对象
     * @date : 2022/10/3 0003 上午 11:17
     */
    IRedisManage giveRedisManage();

    /**
     * 功能描述：自动加锁并执行业务逻辑
     *
     * @param lockKey                  锁定名称
     * @param waitTime                 执行超时时间
     * @param redisLockSuccessFunction 正确处理函数
     * @param trRedisLockErrorFunction 异常处理函数
     * @param managerFunction          回调处理函数
     * @return R 返回泛型
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T, R> R autoLockToManager(String lockKey, int waitTime, RedisLockSuccessFunction<T, R> redisLockSuccessFunction
            , RedisLockErrorFunction<R> trRedisLockErrorFunction, RedisLockManagerFunction<T> managerFunction);

    /**
     * 功能描述：自动加锁并执行业务逻辑
     *
     * @param lockKey                  锁定名称
     * @param redisLockSuccessFunction 正确处理函数
     * @param trRedisLockErrorFunction 异常处理函数
     * @param managerFunction          回调处理函数
     * @return R 返回泛型
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T, R> R autoLockToManager(String lockKey, RedisLockSuccessFunction<T, R> redisLockSuccessFunction
            , RedisLockErrorFunction<R> trRedisLockErrorFunction, RedisLockManagerFunction<T> managerFunction);

    /**
     * 功能描述：自动加锁并执行业务逻辑
     *
     * @param lockKey         锁定名称
     * @param waitTime        执行超时时间
     * @param managerFunction 回调处理函数
     * @return T 返回泛型
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> T autoLockToManager(String lockKey, int waitTime, RedisLockManagerFunction<T> managerFunction) throws Exception;

    /**
     * 功能描述：自动加锁并执行业务逻辑
     *
     * @param lockKey         锁定名称
     * @param managerFunction 回调处理函数
     * @return T 返回泛型
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> T autoLockToManager(String lockKey, RedisLockManagerFunction<T> managerFunction) throws Exception;

    /**
     * 功能描述：限流处理逻辑
     *
     * @param limitingKey     限流标识Key
     * @param maxThreshold    限流最大阀值
     * @param limitingMessage 限流触发回调
     * @param managerFunction 限流执行的处理函数
     * @return T 返回泛型
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> T limitingManager(String limitingKey, long maxThreshold, RedisLimitingMessageFunction<T> limitingMessage
            , RedisLockManagerFunction<T> managerFunction) throws Exception;

    /**
     * 功能描述：限流处理逻辑
     *
     * @param limitingKey              限流标识Key
     * @param redisLockSuccessFunction 正确处理函数
     * @param trRedisLockErrorFunction 异常处理函数
     * @param maxThreshold             限流最大阀值
     * @param limitingMessage          限流触发回调
     * @param managerFunction          限流执行的处理函数
     * @return T 返回泛型
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T, R> R limitingManager(String limitingKey, long maxThreshold, RedisLockSuccessFunction<T, R> redisLockSuccessFunction
            , RedisLockErrorFunction<R> trRedisLockErrorFunction, RedisLimitingMessageFunction<R> limitingMessage
            , RedisLockManagerFunction<T> managerFunction);

    /**
     * 功能描述：限流兼加锁处理逻辑
     *
     * @param limitingKey              限流标识Key
     * @param maxThreshold             限流最大阀值
     * @param redisLockSuccessFunction 正确处理函数
     * @param trRedisLockErrorFunction 异常处理函数
     * @param limitingMessage          限流触发回调
     * @param lockKey                  锁定标识名称
     * @param expireTime               执行超时时间
     * @param managerFunction          锁执行的函数
     * @return T 返回泛型
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T, R> R limitingAndLockManager(String limitingKey, long maxThreshold, RedisLockSuccessFunction<T, R> redisLockSuccessFunction
            , RedisLockErrorFunction<R> trRedisLockErrorFunction, RedisLimitingMessageFunction<R> limitingMessage
            , String lockKey, int expireTime, RedisLockManagerFunction<T> managerFunction);

    /**
     * 功能描述：限流兼加锁处理逻辑
     *
     * @param limitingKey              限流标识Key
     * @param maxThreshold             限流最大阀值
     * @param redisLockSuccessFunction 正确处理函数
     * @param trRedisLockErrorFunction 异常处理函数
     * @param limitingMessage          限流触发回调
     * @param lockKey                  锁定标识名称
     * @param managerFunction          锁执行的函数
     * @return T 返回泛型
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T, R> R limitingAndLockManager(String limitingKey, long maxThreshold, RedisLockSuccessFunction<T, R> redisLockSuccessFunction
            , RedisLockErrorFunction<R> trRedisLockErrorFunction, RedisLimitingMessageFunction<R> limitingMessage
            , String lockKey, RedisLockManagerFunction<T> managerFunction);

    /**
     * 功能描述：限流兼加锁处理逻辑
     *
     * @param limitingKey     限流标识Key
     * @param maxThreshold    限流最大阀值
     * @param limitingMessage 限流触发回调
     * @param lockKey         锁定标识名称
     * @param expireTime      执行超时时间
     * @param managerFunction 锁执行的函数
     * @return T 返回泛型
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> T limitingAndLockManager(String limitingKey, long maxThreshold, RedisLimitingMessageFunction<T> limitingMessage
            , String lockKey, int expireTime, RedisLockManagerFunction<T> managerFunction) throws Exception;

    /**
     * 功能描述：限流兼加锁处理逻辑
     *
     * @param limitingKey     限流标识Key
     * @param maxThreshold    限流最大阀值
     * @param limitingMessage 限流触发回调
     * @param lockKey         锁定标识名称
     * @param managerFunction 锁执行的函数
     * @return T 返回泛型
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> T limitingAndLockManager(String limitingKey, long maxThreshold, RedisLimitingMessageFunction<T> limitingMessage
            , String lockKey, RedisLockManagerFunction<T> managerFunction) throws Exception;
}
